/**
 * @作者 zxy
 * @时间 2023-05-01 20:29
 * @说明 892. 三维形体的表面积
 * 给你一个 n * n 的网格 grid ，上面放置着一些 1 x 1 x 1 的正方体。每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。
 * 放置好正方体后，任何直接相邻的正方体都会互相粘在一起，形成一些不规则的三维形体。
 * 请你返回最终这些形体的总表面积。
 * 注意：每个形体的底面也需要计入表面积中。
 * 示例 1：
 * 输入：grid = [[1,2],[3,4]]
 * 输出：34
 * 示例 2：
 * 输入：grid = [[1,1,1],[1,0,1],[1,1,1]]
 * 输出：32
 */
public class Solution {
    /**
     * 执行用时:5 ms , 在所有Java提交中击败了11.90%的用户
     * 内存消耗: 42.2 MB , 在所有Java提交中击败了5.16% 的用户
     * @param grid
     * @return
     */
    public int surfaceArea(int[][] grid) {
        int resNum = 0;
        for (int i = 0; i < grid.length; i++) {
            for (int i1 = 0; i1 < grid[i].length; i1++) {
                if (grid[i][i1] == 0) continue;
                resNum += 2;
                if (i - 1 < 0) resNum += grid[i][i1];//↑
                else resNum += Math.max(grid[i][i1] - grid[i - 1][i1], 0);
                if (i + 1 > grid.length - 1) resNum += grid[i][i1];//↓
                else resNum += Math.max(grid[i][i1] - grid[i + 1][i1], 0);
                if (i1 - 1 < 0) resNum += grid[i][i1];//←
                else resNum += Math.max(grid[i][i1] - grid[i][i1 - 1], 0);
                if (i1 + 1 > grid[i].length - 1) resNum += grid[i][i1];//→
                else resNum += Math.max(grid[i][i1] - grid[i][i1 + 1], 0);
            }
        }
        return resNum;
    }
}
